Uitwisselprofiel Ministerie van VWS Beleidsontwikkeling over Macro Economische Vraagstukken en Arbeidsmarkt

Over Uitwisselprofiel Ministerie van VWS Beleidsontwikkeling over Macro Economische Vraagstukken en Arbeidsmarkt


Publicatiedatum:
19-11-2025

Inwerkingtreding:
19-11-2025

2.23. Wat is het aantal personeelsleden in loondienst met een zorgverleners functie per kwalificatieniveau per Dag-, Avond- en Nacht-dienst (DAN-dienst)?

Concepten

Relaties

Eigenschappen

SPARQL query

Code gekopieerd

...

Kopieer naar klembord

1# Indicator: MEVA 2.23
2# Parameter: ?jaar
3# Ontologie: versie 3.0 of nieuwer
4
5PREFIX ofn:  	 <http://www.ontotext.com/sparql/functions/>
6PREFIX onz-g:    <http://purl.org/ozo/onz-g#>
7PREFIX onz-pers: <http://purl.org/ozo/onz-pers#>
8PREFIX onz-org:  <http://purl.org/ozo/onz-org#>
9PREFIX rdf:      <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
10PREFIX rdfs:     <http://www.w3.org/2000/01/rdf-schema#>
11PREFIX xsd:      <http://www.w3.org/2001/XMLSchema#>
12
13SELECT
14  ?Periode
15  (?vestiging AS ?Indeling)
16  (?zk_regio_code AS ?Zorgkantoorregio_code)
17  ?Kwalificatieniveau
18  (ROUND( (SUM(?isDag)   / xsd:decimal(?kalenderdagen)) * 100) / 100 AS ?Aantal_gemiddelde_gewerkte_perioden_dagdienst)
19  (ROUND( (SUM(?isAvond) / xsd:decimal(?kalenderdagen)) * 100) / 100 AS ?Aantal_gemiddelde_gewerkte_perioden_avonddienst)
20(ROUND( (SUM(?isNacht) / xsd:decimal(?kalenderdagen)) * 100) / 100 AS ?Aantal_gemiddelde_gewerkte_perioden_nachtdienst)
21WHERE {
22  #BIND(2024 AS ?jaar)
23
24  # ── 1) Alle kwalificatieniveaus altijd tonen ─────────────────
25  {
26    SELECT DISTINCT ?Kwalificatieniveau {
27      ?functie a onz-pers:ZorgverlenerFunctie ;
28               onz-g:hasQuality/onz-g:hasQualityValue ?functie_niveau .
29      ?functie_niveau a onz-pers:ODBKwalificatieWaarde ;
30                      rdfs:label ?Kwalificatieniveau .
31    }
32  }
33
34  # ── 2) Alle indelingen (vestigingen + totaal organisatie) ────
35  {
36    SELECT DISTINCT ?vestiging ?zk_regio_code {
37      {
38        ?vestiging_uri a onz-org:Vestiging ;
39                       onz-g:identifiedBy ?vest_nr ;
40                       onz-g:hasLocalizableArea/onz-g:identifiedBy/onz-g:hasPart/onz-g:hasPart ?postcode_6 .
41        ?vest_nr a onz-org:Vestigingsnummer ; onz-g:hasDataValue ?vestiging .
42
43        BIND(IRI(SUBSTR(STR(?postcode_6), 1, STRLEN(STR(?postcode_6)) - 2)) AS ?postcode)
44        ?pc_gebied onz-g:identifiedBy ?postcode ; onz-g:partOf+ ?zk_regio .
45        ?zk_regio a onz-org:ZorgkantoorRegio .
46        BIND(IF(BOUND(?zk_regio), STRAFTER(STR(?zk_regio), "/onz-org/"), ?unbound) AS ?zk_regio_code)
47      }
48      UNION
49      {
50        ?locatie onz-g:partOf* ?vestiging_uri .
51        ?vestiging_uri onz-org:vestigingVan ?organisatie_uri .
52        BIND("Totaal organisatie" AS ?vestiging)
53      }
54    }
55  }
56
57  # ── 3) Periode-generator (Totaal jaar + Q1–Q4) ───────────────
58  BIND(?jaar AS ?j)
59  BIND(((ofn:floorMod(?j, 400) = 0) || ((ofn:floorMod(?j, 4) = 0) && (ofn:floorMod(?j, 100) != 0))) AS ?isSchrikkel)
60
61  {
62    # Kwartalen
63    VALUES ?kw { 1 2 3 4 }
64    BIND(STRDT(CONCAT(STR(?j), "-", IF(?kw=1,"01-01", IF(?kw=2,"04-01", IF(?kw=3,"07-01","10-01")))), xsd:date) AS ?p_start_q)
65    BIND(STRDT(CONCAT(STR(?j), "-", IF(?kw=1,"03-31", IF(?kw=2,"06-30", IF(?kw=3,"09-30","12-31")))), xsd:date) AS ?p_eind_q)
66    BIND(?p_start_q AS ?p_start)
67    BIND(?p_eind_q  AS ?p_eind)
68    BIND(CONCAT("Q", STR(?kw)) AS ?Periode)
69    BIND(IF(?kw = 1, IF(?isSchrikkel, 91, 90),
70         IF(?kw = 2, 91,
71         IF(?kw = 3, 92, 92))) AS ?kalenderdagen)
72  }
73  UNION
74  {
75    # Totaal jaar
76    BIND("Totaal jaar" AS ?Periode)
77    BIND(xsd:date(CONCAT(STR(?j), "-01-01")) AS ?p_start)
78    BIND(xsd:date(CONCAT(STR(?j), "-12-31")) AS ?p_eind)
79    BIND(IF(?isSchrikkel, 366, 365) AS ?kalenderdagen)
80  }
81
82  # ── 4) Sorteerhulpkolommen ────────────────────────────────────
83  BIND(IF(?Periode = "Totaal jaar", 0, xsd:integer(SUBSTR(?Periode, 2))) AS ?PeriodeSort)
84  BIND(IF(?vestiging = "Totaal organisatie", 0, 1) AS ?IndelingSort)
85
86  # ── 5) Tellingen direct op top-niveau (geen subselect nodig) ─
87  #     Bouw DAN-venster: 07:00 (startdag) t/m 06:59 (dag na eind)
88  BIND(xsd:dateTime(CONCAT(STR(?p_start), "T07:00:00")) AS ?dan_start)
89  BIND(?p_eind + "P1D"^^xsd:duration AS ?eind_periode_plus)
90  BIND(xsd:dateTime(CONCAT(STR(?eind_periode_plus), "T06:59:00")) AS ?dan_end)
91
92  # Werkperiodes + koppelingen (OPTIONAL zodat lege rijen 0 blijven)
93  OPTIONAL {
94    ?gewerkte_periode a onz-pers:GewerktePeriode ;
95                      onz-g:definedBy ?overeenkomst ;
96                      onz-g:hasBeginTimeStamp ?start_werk ;
97                      onz-g:hasEndTimeStamp   ?eind_werk .
98    FILTER(?start_werk >= ?dan_start && ?start_werk <= ?dan_end)
99
100    ?overeenkomst a onz-pers:ArbeidsOvereenkomst ;
101                  onz-pers:heeftOpdrachtnemer ?medewerker ;
102                  onz-g:hasPart ?overeenkomst_afspraak .
103
104    ?overeenkomst_afspraak a onz-pers:WerkOvereenkomstAfspraak ;
105                           onz-g:startDatum ?start_afspraak ;
106                           onz-g:isAbout ?functie .
107    OPTIONAL { ?overeenkomst_afspraak onz-g:eindDatum ?eind_afspraak }
108    FILTER(?start_afspraak <= ?eind_periode_plus &&
109           (!BOUND(?eind_afspraak) || ?eind_afspraak >= ?p_start))
110
111    ?functie a onz-pers:ZorgverlenerFunctie ;
112             onz-g:hasQuality/onz-g:hasQualityValue ?functie_niveau .
113    ?functie_niveau a onz-pers:ODBKwalificatieWaarde ; rdfs:label ?Kwalificatieniveau .
114
115    # Locatie: werk-locatie als die bestaat, anders afspraak-locatie
116    ?overeenkomst_afspraak onz-g:isAbout ?locatie_afspraak .
117    ?locatie_afspraak a onz-g:StationaryArtifact .
118    OPTIONAL { ?gewerkte_periode onz-g:hasPerdurantLocation ?locatie_werk . }
119    BIND(COALESCE(?locatie_werk, ?locatie_afspraak) AS ?locatie)
120
121    {
122      # Vestiging + regio
123      ?locatie onz-g:partOf* ?vestiging_uri .
124      ?vestiging_uri a onz-org:Vestiging ;
125                     onz-g:identifiedBy ?vest_nr ;
126                     onz-g:hasLocalizableArea/onz-g:identifiedBy/onz-g:hasPart/onz-g:hasPart ?postcode_6 .
127      ?vest_nr a onz-org:Vestigingsnummer ; onz-g:hasDataValue ?vestiging .
128      BIND(IRI(SUBSTR(STR(?postcode_6), 1, STRLEN(STR(?postcode_6)) - 2)) AS ?postcode)
129      ?pc_gebied onz-g:identifiedBy ?postcode ; onz-g:partOf+ ?zk_regio .
130      ?zk_regio a onz-org:ZorgkantoorRegio .
131    }
132    UNION
133    {
134      # Totaal organisatie
135      ?locatie onz-g:partOf* ?vestiging_uri .
136      ?vestiging_uri onz-org:vestigingVan ?organisatie_uri .
137      BIND("Totaal organisatie" AS ?vestiging)
138    }
139
140    # Uur uit starttijd
141    BIND(HOURS(?start_werk) AS ?start_uur)
142  }
143
144  # Indicatorvariabelen (pakken 0 als er geen match is)
145  BIND(IF(BOUND(?start_uur) && (?start_uur >= 7  && ?start_uur < 15), 1, 0) AS ?isDag)
146  BIND(IF(BOUND(?start_uur) && (?start_uur >= 15 && ?start_uur < 23), 1, 0) AS ?isAvond)
147  BIND(IF(BOUND(?start_uur) && (?start_uur >= 23 || ?start_uur < 7),  1, 0) AS ?isNacht)
148}
149GROUP BY ?Periode ?PeriodeSort ?vestiging ?IndelingSort ?zk_regio_code ?Kwalificatieniveau ?kalenderdagen
150ORDER BY ?PeriodeSort ?IndelingSort ?vestiging ?Kwalificatieniveau